package com.east.sng.dao;

import com.east.sng.entity.param.RoleParam;
import com.east.sng.entity.result.RoleFind;
import com.east.sng.entity.result.RoleInfo;
import com.east.sng.utils.RedisCache;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * @author east
 * @date: 2021/1/5
 * @Description:
 **/
@Repository
@CacheNamespace(implementation = RedisCache.class)
public interface RoleDao {

	/**
	 * 查询全部角色信息
	 * @param flag 删除标志
	 * @return 角色信息列表
	 */
	@Select("select * from role where flag = #{flag} ")
	List<RoleInfo> selectRoles(Integer flag);

	/**
	 * 根据id查询角色信息
	 * @param roleId 角色id
	 * @return 角色信息实例对象
	 */
	@Select("select role_id,role_name,role_code from role where role_id=#{roleId}")
	RoleFind selectRole(Integer roleId);

	/**
	 * 查询全部角色信息的id和角色名称字段
	 * @return 角色id和角色名称列表
	 */
	@Select("select role_id roleId ,role_name roleName from role where flag = 0")
	List<Map<String, String>> selectRoleColumns();

	/**
	 * 添加角色信息
	 * @param role 角色实例对象
	 */
	@Insert("insert into role(role_name, role_code) " +
			"values (#{role.roleName},#{role.roleCode}) ")
	void insertRole(@Param("role") RoleParam role);

	/**
	 * 修改角色信息
	 * @param role 角色实例对象
	 */
	@Update("update role set " +
			"role_name = #{role.roleName}," +
			"role_code = #{role.roleCode}" +
			"where role_id = #{role.roleId}")
	void updateRole(@Param("role") RoleParam role);

	/**
	 * 删除或恢复角色信息
	 * @param roleId 角色id
	 * @param flag 删除标志
	 * @return 受影响行数
	 */
	@Delete("update role set flag = #{flag} where role_id = #{roleId} ")
	Integer deleteOrRecoverRole(@Param("roleId") Integer roleId,@Param("flag") Integer flag);

	/**
	 * 批量删除或恢复角色信息
	 * @param roleIds 角色id列表
	 * @param flag 删除标志
	 * @return 受影响行数
	 */
	@Delete({"<script>","update role set flag = #{flag} where role_id in",
			"<foreach collection='list' item='roleId' open='(' separator=',' close=')'>",
			"#{roleId}",
			"</foreach>",
			"</script>"})
	Integer batchDeleteOrRecoverRoles(@Param("list") List<Integer> roleIds,@Param("flag") Integer flag);

	/**
	 * 添加角色访问菜单权限
	 * @param roleId 角色id
	 * @param menuIds 菜单id列表
	 */
	@Insert({"<script>","insert into role2menu values ",
			"<foreach collection='menuIds' item='menuId' separator=','>","(#{roleId}, #{menuId})","</foreach>",
			"</script>"})
	Integer insertRoleAssignMenus(@Param("roleId") Integer roleId,@Param("menuIds") List<Integer> menuIds);

	/**
	 * 删除角色访问菜单权限
	 * @param roleId 角色id
	 */
	@Delete("delete from role2menu where role_id = #{roleId} ")
	void deleteRoleAssignMenus(Integer roleId);

	/**
	 * 根据角色id查询角色代码
	 * @param roleId 角色id
	 * @return 角色代码
	 */
	@Select("select role_code from role where role_id=#{roleId} and flag = 0")
	String selectRoleCode(Integer roleId);

	/**
	 * 根据角色id查询授予菜单权限码
	 * @param roleId 角色id
	 * @return 权限码列表
	 */
	@Select("select code from menu where menu_id in (" +
			"select menu_id from role2menu where role_id=#{roleId}" +
			") and code is not null and flag = 0")
	List<String> selectMenuCodes(Integer roleId);

}
